home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 3 / Amiga Tools 3.iso / grafik / raytracing / rayshade-4.0.6.3 / libshade / surfdef.c < prev    next >
C/C++ Source or Header  |  1994-08-09  |  3KB  |  136 lines

  1. /*
  2.  * surfdef.c
  3.  *
  4.  * Copyright (C) 1989, 1991, Craig E. Kolb
  5.  * All rights reserved.
  6.  *
  7.  * This software may be freely copied, modified, and redistributed
  8.  * provided that this copyright notice is preserved on all copies.
  9.  *
  10.  * You may not distribute this software, in whole or in part, as part of
  11.  * any commercial product without the express consent of the authors.
  12.  *
  13.  * There is no warranty or other guarantee of fitness of this software
  14.  * for any purpose.  It is provided solely "as is".
  15.  *
  16.  * surfdef.c,v 4.1 1994/08/09 08:05:04 explorer Exp
  17.  *
  18.  * surfdef.c,v
  19.  * Revision 4.1  1994/08/09  08:05:04  explorer
  20.  * Bump version to 4.1
  21.  *
  22.  * Revision 1.1.1.1  1994/08/08  04:52:18  explorer
  23.  * Initial import.  This is a prerelease of 4.0.6enh3, or 4.1 possibly.
  24.  *
  25.  * Revision 4.0  91/07/17  14:47:53  kolb
  26.  * Initial version.
  27.  * 
  28.  */
  29. #include "rayshade.h"
  30. #include "libsurf/surface.h"
  31.  
  32. static Surface *Surfaces;    /* Named surfaces */
  33.  
  34. Surface DefaultSurface = {
  35.         "DeFault",        /* name */
  36.         {0.1, 0.1, 0.1},    /* ambient */
  37.         {0.6, 0.6, 0.6},    /* diffuse */
  38.         {0.5, 0.5, 0.5},    /* specular */
  39.         {0.0, 0.0, 0.0},    /* Diffuse transmission 'curve' */
  40.         {1.0, 1.0, 1.0},    /* Specular transmission 'curve' */
  41.         12.,            /* reflected Phong coef */
  42.         12.,            /* transmitted Phong coef */
  43.         1.,            /* spec. transmitted attenuation */
  44.         DEFAULT_INDEX,        /* index of refr */
  45.         0.,            /* reflectivity */
  46.         0.,            /* transparency */
  47.         0.,            /* translucency */
  48.         FALSE,            /* noshadow */
  49.         NULL,            /* next */
  50. };
  51.  
  52. Surface *SurfaceGetNamed(), *SurfaceFetchNamed();
  53.  
  54. /*
  55.  * Add surf to the list of defined surfaces.
  56.  */
  57. void
  58. SurfaceAddToDefined(surf)
  59. Surface *surf;
  60. {
  61.     /*
  62.      * Make sure index of refraction isn't bogus.
  63.      */
  64.     if (surf->transp > EPSILON && surf->index <= 0.)
  65.         RLerror(RL_PANIC,
  66.             "Index of refraction must be positive.\n");
  67.  
  68.     if (surf->name == (char *)NULL || *surf->name == (char)NULL)
  69.         RLerror(RL_PANIC, "Surface with NULL name defined.\n");
  70.  
  71.     if (SurfaceFetchNamed(surf->name) != (Surface *)NULL)
  72.         RLerror(RL_WARN,
  73.             "Redefinition of \"%s\" surface.", surf->name);
  74.  
  75.     surf->next = Surfaces;
  76.     Surfaces = surf;
  77. }
  78.  
  79. /*
  80.  * Search for surface with given name.  If not found, complain and exit.
  81.  */
  82. Surface *
  83. SurfaceGetNamed(name)
  84. char *name;
  85. {
  86.     Surface *stmp;
  87.  
  88.     stmp = SurfaceFetchNamed(name);
  89.     if (stmp == (Surface *)NULL)
  90.         RLerror(RL_PANIC, "Undefined surface \"%s\".", name);
  91.  
  92.     return stmp;
  93. }
  94.  
  95. /*
  96.  * Return pointer to surface with given name, NULL if no such surface.
  97.  */
  98. Surface *
  99. SurfaceFetchNamed(name)
  100. char *name;
  101. {
  102.     Surface *stmp;
  103.  
  104.     for (stmp = Surfaces; stmp ; stmp = stmp->next)
  105.         if(strcmp(name, stmp->name) == 0)
  106.             return stmp;
  107.     /*
  108.      * No surface named "name".
  109.      */
  110.     return (Surface *)NULL;
  111. }
  112.  
  113. /*
  114.  * Traverse the given hitlist to find the "bottom-most" surface.
  115.  * If no surface is found, use the default.
  116.  */
  117. Surface *
  118. GetShadingSurf(hitlist)
  119. HitList *hitlist;
  120. {
  121.     int i;
  122.  
  123.     /*
  124.      * -1 here because the World always has a NULL surface
  125.      * (DefaultSurf is used instead)
  126.      */
  127.     for (i = 0; i < hitlist->nodes -1; i++) {
  128.         if (hitlist->data[i].obj->surf)
  129.             return hitlist->data[i].obj->surf;
  130.     }
  131.     /*
  132.      * No suface found -- use the default.
  133.      */
  134.     return &DefaultSurface;
  135. }
  136.